<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    const obj = {
        id: 1,
        name: 'zhangsan',
        age: 12,
        address: '广州',
    }


    /**
     {
        configurable: true 决定这个属性是否可以被删除
        enumerable: true 决定属性是否可以被枚举（for in 进行遍历）
        value: 1 属性的值
        writable: true 属性是否可以被修改
     }
     */
    let info = Reflect.getOwnPropertyDescriptor(obj, 'id');
    console.log('Relect.getOwnPropertyDescriptor', info);


    /* 需求：对象的属性默认是可以被修改，可以被枚举，可以被删除

    1. 希望 obj 对象的 age 属性不能被修改
    2. 然后 id 属性不能被枚举
    3. address 属性不能被删除
     */
    /* 描述  obj 对象的 age 属性不能修改 */

    Reflect.defineProperty(obj, 'age', {
        writable: false,
    });

    Reflect.defineProperty(obj, 'id', {
        /* 描述  obj 对象的 id 属性不能枚举 */
        enumerable: false,
    });


    console.log('尝试修改 obj 的 age 属性');

    obj.age = 12;
    console.log(obj);

    console.log('删除address前：尝试枚举 obj 的 id 属性');
    for (let attr in obj) {
        console.log('obj的属性：', attr);
    }

    // 获取地址
    let address = Reflect.get(obj, 'address');
    console.log('Reflect.get', address);

    // 提供了一个删除对象属性的 api 
    Reflect.deleteProperty(obj, 'address');

    // 可以获取对象属性
    let id = Reflect.get(obj, 'id');
    console.log('Reflect.get', id);



    console.log('删除address后，尝试枚举 obj 的 id 属性');
    for (let attr in obj) {
        console.log('obj的属性：', attr);
    }


</script>


</html>